package com.xie.leetcode.array;

//4. 寻找两个正序数组的中位数
//        给定两个大小分别为 m 和 n 的正序（从小到大）数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
//
//
//
//        示例 1：
//
//        输入：nums1 = [1,3], nums2 = [2]
//        输出：2.00000
//        解释：合并数组 = [1,2,3] ，中位数 2
//        示例 2：
//
//        输入：nums1 = [1,2], nums2 = [3,4]
//        输出：2.50000
//        解释：合并数组 = [1,2,3,4] ，中位数 (2 + 3) / 2 = 2.5
//        示例 3：
//
//        输入：nums1 = [0,0], nums2 = [0,0]
//        输出：0.00000
//        示例 4：
//
//        输入：nums1 = [], nums2 = [1]
//        输出：1.00000
//        示例 5：
//
//        输入：nums1 = [2], nums2 = []
//        输出：2.00000
//
//
//        提示：
//
//        nums1.length == m
//        nums2.length == n
//        0 <= m <= 1000
//        0 <= n <= 1000
//        1 <= m + n <= 2000
//        -106 <= nums1[i], nums2[i] <= 106
//
//
//        进阶：你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗？

import java.math.BigDecimal;
import java.util.Arrays;

/**
 * @author xiezhendong
 * @date 2021/10/26
 */
public class FindMedianSortedArrays {

    public static void main(String[] args) {
        FindMedianSortedArrays findMedianSortedArrays = new FindMedianSortedArrays();
        System.out.println(findMedianSortedArrays.findMedianSortedArrays(new int[]{1, 2}, new int[]{3}));
        System.out.println(findMedianSortedArrays.findMedianSortedArrays(new int[]{1, 2}, new int[]{3, 4}));
        System.out.println(findMedianSortedArrays.findMedianSortedArrays(new int[]{5, 6}, new int[]{3, 4}));
        System.out.println(findMedianSortedArrays.findMedianSortedArrays(new int[]{0, 0}, new int[]{0, 0}));
        System.out.println(findMedianSortedArrays.findMedianSortedArrays(new int[]{}, new int[]{1}));
        System.out.println(findMedianSortedArrays.findMedianSortedArrays(new int[]{2}, new int[]{}));
    }

    /**
     * 暴力遍历
     *
     * @param nums1
     * @param nums2
     * @return
     */
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int num = 0;
        if (nums1 != null && nums1.length > 0) {
            num = num + nums1.length;
        }
        if (nums2 != null && nums2.length > 0) {
            num = num + nums2.length;
        }
        int[] nums = new int[num];
        if (nums1 != null && nums1.length > 0) {
            for (int i = 0; i < nums1.length; i++) {
                nums[i] = nums1[i];
            }
        }
        if (nums2 != null && nums2.length > 0) {
            int num1Len = (nums1 != null ? nums1.length : 0);
            for (int i = 0; i < nums2.length; i++) {
                nums[num1Len + i] = nums2[i];
            }
        }
        Arrays.sort(nums);
        if (num == 0) {
            return 0;
        }
        BigDecimal value = BigDecimal.ZERO;
        if (num % 2 == 1) {
            int numValue = (num / 2);
            value = value.add(BigDecimal.valueOf(nums[numValue]));
        }
        if (num % 2 == 0) {
            int numValue1 = (num / 2) - 1;
            int numValue2 = (num / 2);
            value = value.add(BigDecimal.valueOf(nums[numValue1]));
            value = value.add(BigDecimal.valueOf(nums[numValue2]));
            value = value.divide(BigDecimal.valueOf(2));
        }
        return value.doubleValue();
    }
}
